package com.example.demo.controller.surperController;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.Mapper.ProductInfoMapper;
import com.example.demo.base.Result;
import com.example.demo.entity.ProductInfo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/productInfoSurper")
public class ProductInfoSurperController {
    @Resource
    ProductInfoMapper productInfoMapper;//ProductInfo

    /**
     * 查询全部信息
     *
     * @return
     */
    /*这段代码是一个基于Spring Framework的Java代码段，使用了注解@GetMapping来声明一个HTTP GET请求映射到"/all"这个URI上，
    当客户端向该URI发起GET请求时，这个方法就会被调用。

该方法返回类型为Result<?>，其中?表示通配符类型，表示这个方法返回的结果类型可以是任何类型，这个类型会在运行时动态地确定。
该方法的实现使用了一个名为productInfoMapper的Mapper对象，该对象是通过依赖注入的方式注入进来的，用于访问数据库中的product_info表，查询出所有的产品信息并返回。

Result.success方法是自定义的一个静态方法，用于构建一个成功的结果对象，
该结果对象包含一个data属性，用于存放查询到的所有产品信息。如果查询成功，该方法返回一个Result.success包含查询结果的结果对象；
如果查询失败，则可能会返回一个包含错误信息的Result.error结果对象。

总之，这段代码的作用是通过HTTP GET请求访问数据库中的product_info表，并将查询到的所有产品信息返回给客户端。*/
    @GetMapping("/all")
    public Result<?> findAll() {
        return Result.success(productInfoMapper.selectList(null));
    }

    /**
     * 分页查询
     *
     * @param pageNum
     * @param pageSize
     * @return
     */
    /*这是一个使用 MyBatis-Plus 框架进行分页查询的方法。以下是对代码的分析和解释：

@RequestParam 注解：用于将请求参数绑定到方法参数中。
pageNum 和 pageSize：分别表示要查询的页数和每页的记录数，默认为 1 和 10。
LambdaQueryWrapper：用于构建查询条件的类，可以链式调用条件方法。
Wrappers：MyBatis-Plus 提供的静态工具类，用于创建查询条件构造器。
selectPage 方法：使用 MyBatis-Plus 提供的 selectPage 方法进行分页查询。传入一个 Page 对象作为参数，其中包含了要查询的页数和每页的记录数。
同时，也需要传入一个查询条件构造器对象，用于构建查询条件。
返回值：使用一个 Result 对象作为返回值，其中包含了分页查询的结果。这里使用了泛型，可以支持返回任意类型的结果。
总的来说，这是一个比较简单的分页查询方法，使用了 MyBatis-Plus 提供的分页查询功能，同时也使用了 Java 8 的 Lambda 表达式，使得代码更加简洁和易读。*/
    @GetMapping(value = "/pageAll")
    public Result<?> findPageF(@RequestParam(defaultValue = "1") Integer pageNum,
                               @RequestParam(defaultValue = "10") Integer pageSize) {
        LambdaQueryWrapper<ProductInfo> wrapper = Wrappers.<ProductInfo>lambdaQuery();
        Page<ProductInfo> Page = productInfoMapper.selectPage(new Page<>(pageNum, pageSize), wrapper);
        return Result.success(Page);
    }

    /**
     * 根据主键查询
     * @param id
     * @return
     */
    @GetMapping("/findById/{id}")
    public Result<?> findByComId(@PathVariable String id) {
        ProductInfo productInfo = productInfoMapper.selectById(id);
        List<ProductInfo> productInfoList = new ArrayList<>();
        if (productInfo != null) {
            productInfoList.add(productInfo);
            return Result.success(productInfoList);
        }
        return Result.error(0, "没有查询到相关数据");
    }
    /**
     * 根据产品名称模糊查询
     *
     * @param name
     * @return
     */
    @GetMapping("/findByName/{name}")
    public Result<?> findByProductName(@PathVariable String name) {
        LambdaQueryWrapper<ProductInfo> wrapper = Wrappers.<ProductInfo>lambdaQuery();
        wrapper.like(ProductInfo::getProName, name);
        List<ProductInfo> productInfoList = productInfoMapper.selectList(wrapper);
        if (productInfoList.size() > 0)
            return Result.success(productInfoList);
        return Result.error(0, "没有查询到相关数据");
    }

    /**
     * 根据code删除信息
     *
     * @param code
     * @return
     */
    @DeleteMapping("/delById/{code}")
    public Result<?> delete(@PathVariable String code) {
        int res = productInfoMapper.deleteById(code);
        if (res > 0)
            return Result.success();
        return Result.error(0, "删除失败");
    }

    /**
     * 添加消息
     * @param comId
     * @param proName
     * @param weight
     * @param proBrith
     * @param expiration
     * @param note
     * @return
     */


     @GetMapping(value = "/add")
    public Result<?> saveP(@RequestParam String comId,
                           @RequestParam String proName,
                           @RequestParam String weight,
                           @RequestParam String proBrith,
                           @RequestParam String expiration,
                           @RequestParam String note,
                           @RequestParam String tenantId
    ) {
        if (comId.isEmpty() || proName.isEmpty() || weight.isEmpty() || proBrith.isEmpty() || expiration.isEmpty() ) {
            return Result.error(0, "信息不能为空");
        }
        ProductInfo productInfo = new ProductInfo(Integer.valueOf(comId),proName,Double.valueOf(weight),proBrith,expiration,note,Integer.valueOf(tenantId));
        productInfoMapper.insert(productInfo);
        return Result.success();
    }

    /**
     * 根据主键修改信息
     * @param comId
     * @param proName
     * @param weight
     * @param proBrith
     * @param expiration
     * @param note
     * @return
     */

    @GetMapping(value = "/update")
    public Result<?> updateById(@RequestParam String comId,
                           @RequestParam String proName,
                           @RequestParam String weight,
                           @RequestParam String proBrith,
                           @RequestParam String expiration,
                           @RequestParam String note,
                                @RequestParam String tenantId
    ) {
        if (comId.isEmpty() || proName.isEmpty() || weight.isEmpty() || proBrith.isEmpty() || expiration.isEmpty() ) {
            return Result.error(0, "信息不能为空");
        }
        ProductInfo productInfo = new ProductInfo(Integer.valueOf(comId),proName,Double.valueOf(weight),proBrith,expiration,note,Integer.valueOf(tenantId));
        productInfoMapper.updateById(productInfo);
        return Result.success();
    }
}
